import path from 'path-browserify'
import { ElMessage } from 'element-plus'

const baseUrl = import.meta.env.VITE_APP_API_BASEURL
const filePath = import.meta.env.VITE_APP_FILE

export function deepClone(target) {
    // 定义一个变量
    let result
    // 如果当前需要深拷贝的是一个对象的话
    if (typeof target === 'object') {
        // 如果是一个数组的话
        if (Array.isArray(target)) {
            result = [] // 将result赋值为一个数组，并且执行遍历
            for (let i in target) {
                // 递归克隆数组中的每一项
                result.push(deepClone(target[i]))
            }
            // 判断如果当前的值是null的话；直接赋值为null
        } else if (target === null) {
            result = null
            // 判断如果当前的值是一个RegExp对象的话，直接赋值
        } else if (target.constructor === RegExp) {
            result = target
        } else {
            // 否则是普通对象，直接for in循环，递归赋值对象的所有值
            result = {}
            for (let i in target) {
                result[i] = deepClone(target[i])
            }
        }
        // 如果不是对象的话，就是基本数据类型，那么直接赋值
    } else {
        result = target
    }
    // 返回最终结果
    return result
}

export function isExternalLink(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
}

export function resolveRoutePath(basePath, routePath) {
    if (isExternalLink(routePath)) {
        return routePath
    }
    if (isExternalLink(basePath)) {
        return basePath
    }
    return basePath ? path.resolve(basePath, routePath) : routePath
}

/**
 * @description 复制
 * @param {*} id DOM ID
 */
export function copyDomText(id) {
    const node = document.getElementById(id)
    if (node) {
        let createRange = document.createRange()
        createRange.selectNodeContents(document.getElementById(id))
        const selection = document.getSelection()
        selection.removeAllRanges()
        selection.addRange(createRange)
        document.execCommand('Copy')
        selection.removeAllRanges()
        // alert('已复制')
        ElMessage.success('邮箱已复制')
    }
}

/* 获取路由字符串的参数 */
export function getStrRouteString(routeString) {
    // 使用正则表达式匹配参数部分
    const match = routeString.match(/\?(.*)/)
    if (match) {
        // 获取匹配到的参数部分
        const paramString = match[1]

        // 使用正则表达式将参数字符串拆分为键值对数组
        const paramArray = paramString.split('&')

        // 创建一个对象来存储参数
        const params = {}

        // 将参数键值对添加到对象中
        paramArray.forEach(param => {
            const [key, value] = param.split('=')
            params[key] = value
        })
        return params
    } else {
        console.log('没有找到参数')
        return {}
    }
}

// 获取图片尺寸
export function getImgSize(url) {
    return new Promise(resolve => {
        let imgObj = new Image()
        imgObj.src = url
        imgObj.onload = () => {
            resolve({
                width: imgObj.width,
                height: imgObj.height
            })
        }
    })
}

/**
 * 加密手机号码中间四位
 * @param phone 手机号
 * @returns { string } 加密后的手机号
 */
export function encryptPhoneNumber(phone) {
    if (phone) {
        const reg = /(\d{3})\d{4}(\d{4})/ // 正则表达式
        return String(phone).replace(reg, '$1****$2') // 返回加密后的电话号码
    }
    return ''
}

// 分辨跳转路由是移动端 还是PC端
export function initPath(type, path) {
    if (!type) {
        return path + 'm'
    }
    return path
}

// 使用<a>标签进行文件下载
export function downloadFile(path, fileName) {
    const url = baseUrl + filePath + path
    const x = new XMLHttpRequest()
    x.open('GET', url, true)
    x.responseType = 'blob'
    x.onload = e => {
        // 会创建一个 DOMString，其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
        const url = window.URL.createObjectURL(x.response)
        const a = document.createElement('a')
        a.href = url
        a.download = fileName
        a.click()
    }
    x.send()
}

// 超过4位截取保留4位，不足4位补足0
export function getFloat(number, n) {
    n = n ? parseInt(n) : 0
    if (n <= 0) {
        return Math.round(number)
    }
    number = Math.round(number * Math.pow(10, n)) / Math.pow(10, n) // 四舍五入
    number = Number(number).toFixed(n) // 补足位数
    return number
}
